package com.coder.books.thinkinjava.exceptions;

/**
 *
 * @author yuhushuan
 * @date 2020/7/29 11:55
 */

// 棒球异常
class BaseballException extends Exception {
}

// 犯规异常
class Foul extends BaseballException {
}

// 打击异常
class Strike extends BaseballException {
}

// 入驻
abstract class Inning {
    public Inning() throws BaseballException {
    }

    public void event() throws BaseballException {
        // 实际上不抛出异常
    }

    // bat 棒球棒
    public abstract void atBat() throws Strike, Foul;

    public void walk() {
    }
}

// 暴风雨
class StormException extends Exception {
}

// 下雨
class RainedOut extends StormException {
}

// 波及犯规
class PopFoul extends Foul {
}

interface Storm {
    void event() throws RainedOut;

    void rainHard() throws RainedOut;
}

public class StormyInning extends Inning implements Storm {

    // 可以为构造函数添加新的异常，但是必须处理基本的构造函数异常
    public StormyInning() throws BaseballException, RainedOut {
    }

    public StormyInning(String s) throws Foul, BaseballException {
    }

    // 常规方法必须符合基类
//    @Override
//    public void walk() throws PopFoul{
//        super.walk();
//    }


    // 无法从基类、接口向现有方法添加异常
//    @Override
//    public void event() throws RainedOut {
//    }

    // 如果该方法在基类中尚不存在，则可以。
    @Override
    public void rainHard() throws RainedOut {

    }

    // 您可以选择不抛出任何异常，即使基本版本也是如此。
    @Override
    public void event() {
    }

    // 重写的方法可以抛出继承的异常
    @Override
    public void atBat() throws PopFoul {

    }


}
